import { http } from '@kit.NetworkKit'; // 引入 http
import { BusinessError } from '@kit.BasicServicesKit'; // 引入错误处理模块

// 定义请求头类型
export interface RequestHeader {
  'Content-Type'?: string;
  'Authorization'?: string;
  'Accept'?: string;
}

// 定义统一的 HTTP 响应类型
export interface ApiResponse<T = any> {
  success: boolean;  // 请求是否成功
  message: string;   // 提示信息
  data?: T;          // 可选的数据字段，根据具体接口不同而不同
}

// 封装 GET 请求
export async function get<T>(
  url: string,
  headers: RequestHeader = {},
  timeout: number = 60000
): Promise<ApiResponse<T>> {
  return sendRequest<T>(url, 'GET', headers, null, timeout);
}

// 封装 POST 请求
export async function post<T>(
  url: string,
  data: object | string | ArrayBuffer,
  headers: RequestHeader = {},
  timeout: number = 60000,
): Promise<ApiResponse<T>> {
  return sendRequest<T>(url, 'POST', headers, data, timeout);
}

// 封装 PUT 请求
export async function put<T>(
  url: string,
  data: object | string | ArrayBuffer,
  headers: RequestHeader = {},
  timeout: number = 60000
): Promise<ApiResponse<T>> {
  return sendRequest<T>(url, 'PUT', headers, data, timeout);
}

// 封装 DELETE 请求
export async function deleteRequest<T>(
  url: string,
  headers: RequestHeader = {},
  timeout: number = 60000
): Promise<ApiResponse<T>> {
  return sendRequest<T>(url, 'DELETE', headers, null, timeout);
}

// 通用的 HTTP 请求发送方法
async function sendRequest<T>(
  url: string,
  method: 'GET' | 'POST' | 'PUT' | 'DELETE',
  headers: RequestHeader = {},
  data: object | string | ArrayBuffer | null = null,
  timeout: number = 60000
): Promise<ApiResponse<T>> {
  return new Promise<ApiResponse<T> | null>((resolve, reject) => {
    const httpRequest = http.createHttp();  // 创建 http 实例
    // 动态添加 Token 到请求头
    const accessToken = AppStorage.get('accessToken');
    if (accessToken) {
      headers['Authorization'] = `Bearer ${accessToken}`;
    }
    const options = {
      method: http.RequestMethod[method],  // 使用 http 请求方法
      extraData: data,                    // 请求数据
      header: headers,                    // 请求头
      readTimeout: timeout,               // 超时时间
    };
    // 发起请求
    httpRequest.request(url, options, (err: BusinessError | null, res: http.HttpResponse) => {
      if (err) {
        reject(err);  // 请求失败，抛出错误
      } else {
        // 解析 result
        let result: any;

        // 如果 result 是字符串，尝试解析为对象
        if (typeof res.result === 'string') {
          try {
            result = JSON.parse(res.result);
          } catch (e) {
            reject(new Error('Failed to parse JSON response'));
            return;
          }
        } else if (res.result instanceof Object) {
          // 如果 result 是对象，直接使用
          result = res.result;
        } else {
          // 如果 result 是 ArrayBuffer，你可以在这里进行转换（如果需要）
          reject(new Error('Unsupported result type'));
          return;
        }

        // 构造 ApiResponse
        const apiResponse: ApiResponse<T> = {
          success: result.type=="success",
          message: result.message,
          data: result.result,
        };

        resolve(apiResponse);  // 返回 ApiResponse 类型
      }
      httpRequest.destroy();  // 销毁请求实例

    });
  });
}
